﻿using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using RandomKeyGenerator;
using AlgoritmoConstrutivo.entidades;
using Algoritmos.clustersPorVizinho;
using Algoritmos;

namespace UnitTestAlgoritmoConstrutivo
{
    [TestClass]
    public class BuscaLocalTest
    {

        private const int INDIVIDUOS = 1;
        private Cromossomo[] cromossomos; //vetor de vetores de numeros aleatorios
        private FabricaCromossomos fabricaRandomKeys; //fabrica de numeros aleatorios
        private int numeroNos = 10;

        [TestMethod]
        public void ValidandoBuscaLocalComInstanciaModelo()
        {
            this.fabricaRandomKeys = new FabricaCromossomos(this.numeroNos);
            this.cromossomos = new Cromossomo[INDIVIDUOS];
            this.GeraCromossomos();
            Grafo instanciaTeste = this.MontaGrafo();

            Algoritmo clusterPorVizinhos = new ClustersPorVizinhos();

          //  Entidades.Configuration.Porc_Vizinhos = 1;

            Cromossomo rk = new Cromossomo();
            rk.Value = this.cromossomos[0].Value;
            rk.Chaves = new Gene[this.numeroNos];
            rk.Chaves = this.cromossomos[0].Chaves;


            instanciaTeste = clusterPorVizinhos.Decoder(INDIVIDUOS, instanciaTeste, rk,0,"teste");
            instanciaTeste.CalculaMQ();

            //instanciaTeste = clusterPorVizinhos.Decoder(INDIVIDUOS, instanciaTeste, this.cromossomos, 0);

            //instanciaTeste.CalculaMQ();

            Decimal mqAntesBuscaLocal = instanciaTeste.Mq;

            Assert.IsTrue(instanciaTeste.Mq == 1.905M);


            clusterPorVizinhos.BuscaLocal(this.cromossomos[0], instanciaTeste);
            instanciaTeste.CalculaMQ();

            Decimal mqDepoisBuscaLocal = instanciaTeste.Mq;

            Assert.IsTrue (mqAntesBuscaLocal >= mqDepoisBuscaLocal);


        }


        /// <summary>
        /// A partir do numero de cromossomos definido, gera cada um dos cromossomos.
        /// </summary>
        private void GeraCromossomos()
        {
            Gene rk1 = new Gene();
            rk1.Indice = 0;
            rk1.KeyOrdenacao = 0.03;
            rk1.KeyCriterio = 0.76;

            Gene rk2 = new Gene();
            rk2.Indice = 1;
            rk2.KeyOrdenacao = 0.45;
            rk2.KeyCriterio = 0.08;

            Gene rk3 = new Gene();
            rk3.Indice = 2;
            rk3.KeyOrdenacao = 0.10;
            rk3.KeyCriterio = 0.04;

            Gene rk4 = new Gene();
            rk4.Indice = 3;
            rk4.KeyOrdenacao = 0.87;
            rk4.KeyCriterio = 0.94;

            Gene rk5 = new Gene();
            rk5.Indice = 4;
            rk5.KeyOrdenacao = 0.01;
            rk5.KeyCriterio = 0.31;

            Gene rk6 = new Gene();
            rk6.Indice = 5;
            rk6.KeyOrdenacao = 0.22;
            rk6.KeyCriterio = 0.51;

            Gene rk7 = new Gene();
            rk7.Indice = 6;
            rk7.KeyOrdenacao = 0.24;
            rk7.KeyCriterio = 0.33;

            Gene rk8 = new Gene();
            rk8.Indice = 7;
            rk8.KeyOrdenacao = 0.03;
            rk8.KeyCriterio = 0.76;

            Gene rk9 = new Gene();
            rk9.Indice = 8;
            rk9.KeyOrdenacao = 0.21;
            rk9.KeyCriterio = 0.65;

            Gene rk10 = new Gene();
            rk10.Indice = 9;
            rk10.KeyOrdenacao = 0.65;
            rk10.KeyCriterio = 0.23;

            Gene[] rk = { rk1, rk2, rk3, rk4, rk5, rk6, rk7, rk8, rk9, rk10 };

            Array.Sort(rk);

            this.cromossomos[0] = new Cromossomo();

            this.cromossomos[0].Value = 4;
            this.cromossomos[0].Chaves = rk;
        }

        private Grafo MontaGrafo()
        {
            Grafo software1 = new Grafo();
            No primNo = new No(0);
            primNo.ArestasQueSaem = new Vizinhos();

            No psegNo = new No(1);
            psegNo.ArestasQueSaem = new Vizinhos();

            No tercNo = new No(2);
            tercNo.ArestasQueSaem = new Vizinhos();

            No quartNo = new No(3);
            quartNo.ArestasQueSaem = new Vizinhos();

            No quintNo = new No(4);
            quintNo.ArestasQueSaem = new Vizinhos();

            No sextNo = new No(5);
            sextNo.ArestasQueSaem = new Vizinhos();

            No setNo = new No(6);
            setNo.ArestasQueSaem = new Vizinhos();

            No octNo = new No(7);
            octNo.ArestasQueSaem = new Vizinhos();

            No nonoNo = new No(8);
            nonoNo.ArestasQueSaem = new Vizinhos();

            No decNo = new No(9);
            decNo.ArestasQueSaem = new Vizinhos();

            software1.AddNo(primNo);
            software1.AddNo(psegNo);
            software1.AddNo(tercNo);
            software1.AddNo(quartNo);
            software1.AddNo(quintNo);
            software1.AddNo(sextNo);
            software1.AddNo(setNo);
            software1.AddNo(octNo);
            software1.AddNo(nonoNo);

            software1.AddNo(decNo);

            software1.AdicionaArestaDirecionada(0, 3);

            software1.AdicionaArestaDirecionada(1, 3);

            software1.AdicionaArestaDirecionada(2, 3);
            software1.AdicionaArestaDirecionada(2, 5);
            software1.AdicionaArestaDirecionada(2, 8);


            software1.AdicionaArestaDirecionada(4, 7);



            software1.AdicionaArestaDirecionada(5, 3);
            software1.AdicionaArestaDirecionada(5, 4);
            software1.AdicionaArestaDirecionada(5, 6);

            software1.AdicionaArestaDirecionada(6, 5);


            software1.AdicionaArestaDirecionada(7, 8);
            software1.AdicionaArestaDirecionada(7, 6);
            software1.AdicionaArestaDirecionada(7, 4);

            software1.AdicionaArestaDirecionada(8, 5);

            return software1;

        }
    }
}
